import java.util.Scanner;
import java.util.*;

class Main {

   // 第一题-完成
//   public static void main(String[] args) {
//
//      Scanner input = new Scanner(System.in);
//      int a = input.nextInt();
//      System.out.println(2025 + a);
//      input.close();
//   }

   // 第三题-完成
//   public static void main(String[] args) {
//      Scanner input = new Scanner(System.in);
//
//      // 1 接收输入
//      long n = input.nextLong();
//      long a = 0;
//      long b = 0;
//      for(int i = 0; i < n; i++) {
//         a += input.nextLong();
//      }
//      for(int i = 0; i < n; i++) {
//         b += input.nextLong();
//      }
//
//      // 2 输出
//      if((a * b) % 2 == 0) {
//         System.out.println("even");
//      } else {
//         System.out.println("odd");
//      }
//      input.close();
//   }

   // 第四题-完成
//   public static void main(String[] args) {
//      Scanner input = new Scanner(System.in);
//
//      // 1 接受输入
//      String s = input.next();
//      int x = 0;
//      int y = 0;
//
//      // 2 直接逻辑
//      for(char e: s.toCharArray()) {
//         if(e == 'U') {
//            y++;
//         } else if(e == 'D') {
//            y--;
//         } else if(e == 'L') {
//            x--;
//         } else {
//            x++;
//         }
//      }
//
//      // 3 返回值
//      System.out.println(x + " " + y);
//      input.close();
//   }

   // 第六题-未完成，无法求得最小公倍数，而我所做的操作也仅仅是减少了冗余数据
//   public static void main(String[] args) {
//      Scanner input = new Scanner(System.in);
//
//      // 1 接收输入
//      int n = input.nextInt();
//      int MOD = 998244353;
//      long answer = 1;
//      Set<Integer> set = new HashSet<>();
//
//      // 2 处理因数
//      for(int i = 0; i < n; i ++) {
//         int tempVal = input.nextInt();
//         // -不存在时才处理
//         if(!set.contains(tempVal)) {
//            // -循环处理集合元素
//            Iterator<Integer> it = set.iterator();
//            boolean isJoin = true;
//            while(it.hasNext()) {
//               int next = it.next();
//               if(next > tempVal && next % tempVal == 0) {
//                  // 新值为已有数的因数，不加入
//                  isJoin = false;
//                  break;
//               }
//               if(next < tempVal && tempVal % next == 0) {
//                  // 新值为已有数的倍数，删除因数
//                  it.remove();
//               }
//            }
//            if(isJoin) {
//               set.add(tempVal);
//            }
//         }
//      }
//
//      // 3 计算值
//      Iterator<Integer> it = set.iterator();
//      while(it.hasNext()) {
//         answer = (it.next() * answer) % MOD;
//      }
//
//      // 4 返回值
//      System.out.println(answer);
//      input.close();
//   }

//   public static void main(String[] args) {
//      System.out.println(7%12);
//      System.out.println(12%3);
//   }

   // 第七题-逻辑正确，但是需要进行优化
//   public static void main(String[] args) {
//      Scanner input = new Scanner(System.in);
//
//      // 1 接收输入
//      int n = input.nextInt();
//      int q = input.nextInt();
//      int MOD = 998244353;
//      long sum = 0;
//      int[] arr = new int[n];
//      for(int i = 0; i < n; i++) {
//         arr[i] = input.nextInt();
//         sum += arr[i];
//      }
//
//      // 2 接收操作逻辑
//      for(int i = 0; i < q; i++) {
//         int opt = input.nextInt();
//         if(opt == 1) {
//            // -法力精进
//            for(int j = 0; j < n; j++) {
//               int lowBit = arr[j]&-arr[j];
//               sum = (sum + lowBit) % MOD;
//               arr[j] += lowBit;
//            }
//         } else {
//            // -法力汇总
//            System.out.println(sum);
//         }
//      }
//      input.close();
//   }

   // 第八题-完成
//   public static void main(String[] args) {
//
//      Scanner input = new Scanner(System.in);
//
//      // 1 接收输入
//      String s = input.next();
//      char[] chars = s.toCharArray();
//
//      // 2 双指针
//      int answer = 0;
//      int l = 0;
//      int r = chars.length-1;
//      while(l < r) {
//         if(chars[l++] != chars[r--]) {
//            answer ++;
//         }
//      }
//      System.out.println(answer);
//
//      input.close();
//   }

   // 第九题-完成
//   public static void main(String[] args) {
//
//      Scanner input = new Scanner(System.in);
//
//      // 1 接收输入
//      int n = input.nextInt();
//      int k = input.nextInt();
//      int[] arr = new int[n];
//      for(int i = 0; i < n; i++) {
//         arr[i] = input.nextInt();
//      }
//      // -排升序
//      Arrays.sort(arr);
//      int operateIndex = 0;
//      long answer = 0;
//
//      // 2 执行逻辑
//      while(k > 0) {
//         if(k >= arr[operateIndex]) {
//            answer += (long) (1 + arr[operateIndex]) *arr[operateIndex]/2;
//            k -= arr[operateIndex];
//            operateIndex++;
//         } else {
//            int extra = arr[operateIndex]-k;
//            answer += (long) (1 + arr[operateIndex]) *arr[operateIndex]/2 - (long) (1 + extra) *extra/2;
//            break;
//         }
//      }
//
//      // 3 返回值
//      System.out.println(answer);
//
//      input.close();
//   }

    // 第十题-暂缓
//      public static void main(String[] args) {
//
//      Scanner input = new Scanner(System.in);
//
//      // 1 接收输入
//      int n = input.nextInt();
//      int k = input.nextInt();
//      int[] arr = new int[n];
//      for(int i = 0; i < n; i++) {
//         arr[i] = input.nextInt();
//      }
//      // -排升序
//      long answer = 0;
//
//      // 2 执行逻辑
//      while(k > 0) {
//         // -1 找到最大值小标
//         Arrays.sort(arr);
//         answer += arr[n-1];
//         arr[n-1] --;
//         k--;
//      }
//
//      // 3 返回值
//      System.out.println(answer);
//
//      input.close();
//   }

    // 第十一题-完成
//    public static void main(String[] args) {
//        Scanner input = new Scanner(System.in);
//
//        // 1 接收输入
//        int n = input.nextInt();
//        long answer = 0;
//        for(int i = 0; i < n; i++) {
//            answer += mode(input.nextInt());
//        }
//        System.out.println(answer);
//
//        input.close();
//    }
//
//    public static int mode(int n) {
//        /**
//         * 计算数位和*/
//        int answer = 0;
//        while(n > 0) {
//            answer += n%10;
//            n /= 10;
//        }
//        return answer;
//    }


    // 第十二题-暂时搁置
//    public static void main(String[] args) {
//        Scanner input = new Scanner(System.in);
//
//        // 1 接收输入
//        int n = input.nextInt();
//        int m = input.nextInt();
//        int[][] arr = new int[n*m][m];
//        for(int i = 0; i < n*m; i++) {
//            for(int j = 0; j < m; j++) {
//                arr[i][j] = input.nextInt();
//            }
//        }
//
//        // 2 执行逻辑
//        int[][] answer = new int[m][m];
//        for(int i = 0; i < m; i++) {
//            for(int j = 0; j < m; j++) {
//
//            }
//        }
//        input.close();
//    }

//    public static void main(String[] args) {
//        /**
//         * 由于左旋和右旋可以抵消，故仅关注操作次数*/
//        Scanner input = new Scanner(System.in);
//
//        // 1 接收输入
//        int n = input.nextInt();
//        int q = input.nextInt();
//        int[] arr = new int[n];
//        for(int i = 0; i < n; i++) {
//            arr[i] = input.nextInt();
//        }
//
//        // 2 执行逻辑
//        int operateCount = 0;
//        for(int i = 0; i < q; i++) {
//            if(input.nextInt() == 1) {
//                operateCount++;
//            } else {
//                operateCount--;
//            }
//        }
//
//        // 3 输出
//        int start = operateCount;
//        if(operateCount < 0) {
//            start = n + operateCount;
//        }
//        for(int i = start; i < n; i++) {
//            System.out.print(arr[i] + " ");
//        }
//        for(int i = 0; i < start; i++) {
//            System.out.print(arr[i] + " ");
//        }
//        input.close();
//    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        // 1 接收输入
        int n = input.nextInt();
        int m = input.nextInt();
        int[][][] arr = new int[n][m][m];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                for(int z = 0; z < m; z++) {
                    arr[i][j][z] = input.nextInt();
                }
            }
        }

        // 2 依次执行（此处传参需要严格按照要求）
        int[][] retArray = arr[n-1];
        for(int i = n-2; i >= 0; i--) {
            retArray = demo(arr[i], retArray);
        }

        // 3 输出
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < m; j++) {
                System.out.print(retArray[i][j] + " ");
            }
            System.out.println();
        }

        input.close();
    }

    public static int[][] demo(int[][] a, int[][] b) {
        /**
         * 合并两个矩阵*/
        // 1 预处理
        int m = a.length;
        int[][] retArray = new int[m][m];

        // 2 填写表格
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < m; j++) {
                // -按照题意进行操作
                int tempVal = 0;
                for(int k = 0; k < m; k++) {
                    tempVal += (a[i][k] * b[k][j]);
                }
                tempVal %= 2;
                retArray[i][j] = tempVal;
            }
        }

        // 3 返回值
        return retArray;
    }
}